<?php

class UserController extends BackEndController {

    /**
     * @var string the default layout for the views. Defaults to '//layouts/column2', meaning
     * using two-column layout. See 'protected/views/layouts/column2.php'.
     */
    public $layout = '//layouts/column2';

    /**
     * @return array action filters
     */
    public function filters() {
        return array(
            'accessControl', // perform access control for CRUD operations
        );
    }

    /**
     * Specifies the access control rules.
     * This method is used by the 'accessControl' filter.
     * @return array access control rules
     */
    public function accessRules() {
        return array(
            array('allow', // allow all users to perform 'index' and 'view' actions
                'actions' => array('index', 'view', 'create', 'update', 'ajaxupdate'),
                'roles' => array('admin'),
            ),
            array('allow',
                'actions' => array('delete'),
                'roles' => array('super')
            ),
            array('deny', // deny all users
                'users' => array('*'),
            ),
        );
    }

    public function actionAjaxUpdate() {
        $act = $_GET['act'];
        $autoIdAll = $_POST['autoId'];
        if (count($autoIdAll) > 0) {
            foreach ($autoIdAll as $autoId) {
                $model = $this->loadUser($autoId);
                if ($act == 'doDelete') {
                    $model->delete();
                } else {
                    if ($act == 'doActive')
                        $model->status = 1;
                    if ($act == 'doInactive')
                        $model->status = 0;
                    if ($model->save())
                        echo 'ok';
                    else
                        throw new Exception("Sorry", 500);
                }
            }
        }
    }

    /**
     * Displays a particular model.
     * @param integer $id the ID of the model to be displayed
     */
    public function actionView($id) {
        $image = new CActiveDataProvider('Image', array(
            'criteria' => array(
                'condition' => 'user_created=' . $id
            ))
        );
        $this->render('view', array(
            'model' => $this->loadUser($id),
            'image' => $image
        ));
    }

    /**
     * Creates a new model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     */
    public function actionCreate() {
        $model = new User('create');

// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);

        if (isset($_POST['User'])) {
            $model->attributes = $_POST['User'];
            if ($model->exists('username=:username', array(':username' => $model->username))) {
                $model->addError('username', 'Tài khoản đã được đăng ký');
            } elseif ($model->exists('email=:email', array(':email' => $model->email))) {
                $model->addError('email', 'Email đã được đăng ký');
            } else {
                $uploadedFile = CUploadedFile::getInstance($model, 'avatar');
                $fileName = $model->username . '.' . $uploadedFile->extensionName;
                $model->avatar = $fileName;
                $model->created_at = date("Y-m-d H:i:s");
                $model->password = md5($model->password);
                if ($model->save()) {
                    if (!file_exists(Yii::getPathOfAlias('webroot') . '/upload/user/' . $model->id)) {
                        mkdir(Yii::getPathOfAlias('webroot') . '/upload/user/' . $model->id, 0755);
                        mkdir(Yii::getPathOfAlias('webroot') . '/upload/user/' . $model->id . '/avatar', 0755);
                        mkdir(Yii::getPathOfAlias('webroot') . '/upload/user/' . $model->id . '/images', 0755);
                    }
                    $uploadedFile->saveAs(Yii::getPathOfAlias('webroot') . '/upload/user/' . $model->id . '/avatar/' . $fileName);
                    $this->redirect(array('view', 'id' => $model->id));
                }
            }
        }

        $this->render('create', array(
            'model' => $model,
        ));
    }

    /**
     * Updates a particular model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id the ID of the model to be updated
     */
    public function actionUpdate($id) {
        $model = $this->loadUser($id);

// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);

        if (isset($_POST['User'])) {
            $model->attributes = $_POST['User'];
            if ($model->save())
                $this->redirect(array('view', 'id' => $model->id));
        }

        $this->render('update', array(
            'model' => $model,
        ));
    }

    /**
     * Deletes a particular model.
     * If deletion is successful, the browser will be redirected to the 'admin' page.
     * @param integer $id the ID of the model to be deleted
     */
    public function actionDelete($id) {
        if (Yii::app()->request->isPostRequest) {
// we only allow deletion via POST request
            $this->loadUser($id)->delete();

            $allImage = glob(Yii::getPathOfAlias('webroot') . '/upload/user/' . $id . '/images/*'); // get all file names
            foreach ($allImage as $image) { // iterate files
                if (is_file($image))
                    unlink($image); // delete file
            }
            $avatar = glob(Yii::getPathOfAlias('webroot') . '/upload/user/' . $id . '/avatar/*'); // get all file names
            foreach ($avatar as $a) { // iterate files
                if (is_file($a))
                    unlink($a); // delete file
            }
            rmdir(Yii::getPathOfAlias('webroot') . '/upload/user/' . $id . '/avatar');
            rmdir(Yii::getPathOfAlias('webroot') . '/upload/user/' . $id . '/images');
            rmdir(Yii::getPathOfAlias('webroot') . '/upload/user/' . $id);

            $comments = Comment::model()->findAll('user_id=:id', array(':id' => $id));
            if ($comments != null) {
                foreach ($comments as $comment) {
                    $comment->delete();
                }
            }

            $imageViews = ImageView::model()->findAll('user_id=:id', array(':id' => $id));
            if ($imageViews != null) {
                foreach ($imageViews as $imageView) {
                    $imageView->delete();
                }
            }

            $images = Image::model()->findAll('user_created=:id', array(':id' => $id));
            if ($images != null) {
                foreach ($images as $image) {
                    $image->delete();
                }
            }

            $imageLikes = ImageLike::model()->findAll('user_id=:id', array(':id' => $id));
            if ($imageLikes != null) {
                foreach ($imageLikes as $imageLike) {
                    $imageLike->delete();
                }
            }
            $imageFollows = ImageUserFollow::model()->findAll('user_id=:id', array(':id' => $id));
            if ($imageFollows != null) {
                foreach ($imageFollows as $imageFollow) {
                    $imageFollow->delete();
                }
            }
            $userActives = UserActive::model()->findAll('user_id=:id', array(':id' => $id));
            if ($userActives != null) {
                foreach ($userActives as $userActive) {
                    $userActive->delete();
                }
            }
            $userFollows = UserFollow::model()->findAll('follower=:follower and followed=:followed', array(':follower' => $id, ':followed' => $id));
            if ($userFollows != null) {
                foreach ($userFollows as $userFollow) {
                    $userFollow->delete();
                }
            }

// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
            if (!isset($_GET['ajax']))
                $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('index'));
        }
        else
            throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.');
    }

    /**
     * Manages all models.
     */
    public function actionIndex() {
        $model = new User('search');
        $model->unsetAttributes();  // clear any default values
        if (isset($_GET['User']))
            $model->attributes = $_GET['User'];

        $this->render('index', array(
            'model' => $model,
        ));
    }

    /**
     * Returns the data model based on the primary key given in the GET variable.
     * If the data model is not found, an HTTP exception will be raised.
     * @param integer the ID of the model to be loaded
     */
    public function loadUser($id) {
        $model = User::model()->findByPk($id);
        if ($model === null)
            throw new CHttpException(404, 'The requested page does not exist.');
        return $model;
    }

    public function loadImage($id) {
        $model = Image::model()->findAll('user_created=:user', array(':user' => $id));
        if ($model === null)
            throw new CHttpException(404, 'The requested page does not exist.');
        return $model;
    }

    /**
     * Performs the AJAX validation.
     * @param CModel the model to be validated
     */
    protected function performAjaxValidation($model) {
        if (isset($_POST['ajax']) && $_POST['ajax'] === 'user-form') {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }
    }

}
